package com.example.rabbitmq.starter.controller;

import com.example.rabbitmq.starter.entity.MQConfigInfo;
import com.example.rabbitmq.starter.exception.ApiResponse;
import com.example.rabbitmq.starter.exception.BusinessException;
import com.example.rabbitmq.starter.exception.ResourceNotFoundException;
import com.example.rabbitmq.starter.service.MQConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;

/**
 * MQ配置管理控制器
 *
 * @author example
 * @since 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/api/rabbitmq/mqConfig")
@RequiredArgsConstructor
public class MQConfigController {

    private final MQConfigService mqConfigService;

    /**
     * 分页查询MQ配置
     *
     * @param page        页码，从0开始
     * @param size        每页大小
     * @param messageType 消息类型（可选）
     * @param enabled     是否启用（可选）
     * @param sort        排序字段，默认按创建时间倒序
     * @return 分页结果
     */
    @GetMapping("/page")
    public ApiResponse<Page<MQConfigInfo>> getConfigs(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(required = false) String messageType,
            @RequestParam(required = false) Boolean enabled,
            @RequestParam(defaultValue = "createTime") String sort) {

        // 创建分页和排序对象
        Sort sortObj = Sort.by(Sort.Direction.DESC, sort);
        Pageable pageable = PageRequest.of(page, size, sortObj);

        // 根据条件查询
        Page<MQConfigInfo> result;
        if (messageType != null && enabled != null) {
            result = mqConfigService.findByMessageTypeAndEnabled(messageType, enabled, pageable);
        }
        else if (messageType != null) {
            result = mqConfigService.findByMessageType(messageType, pageable);
        }
        else if (enabled != null) {
            result = mqConfigService.findByEnabled(enabled, pageable);
        }
        else {
            result = mqConfigService.findAll(pageable);
        }

        return ApiResponse.success("查询成功", result);
    }

    /**
     * 查询所有MQ配置
     *
     * @return MQ配置列表
     */
    @GetMapping("/list")
    public ResponseEntity<List<MQConfigInfo>> getAllConfigs() {
        try {
            List<MQConfigInfo> configs = mqConfigService.getAllConfigs();
            return ResponseEntity.ok(configs);
        }
        catch (Exception e) {
            log.error("查询所有MQ配置失败: {}", e.getMessage(), e);
            return ResponseEntity.badRequest().build();
        }
    }

    /**
     * 根据ID获取MQ配置
     *
     * @param id 配置ID
     * @return MQ配置信息
     */
    @GetMapping("/get")
    public ApiResponse<MQConfigInfo> getConfigById(@RequestParam String id) {
        MQConfigInfo config = mqConfigService.findById(id);
        if (config == null) {
            throw new ResourceNotFoundException("MQ配置不存在");
        }
        return ApiResponse.success("查询成功", config);
    }

    /**
     * 根据消息类型获取MQ配置
     *
     * @param messageType 消息类型
     * @return MQ配置信息
     */
    @GetMapping("/getByMessageType")
    public ApiResponse<List<MQConfigInfo>> getConfigsByMessageType(@RequestParam String messageType) {
        List<MQConfigInfo> configs = mqConfigService.findByMessageType(messageType);
        return ApiResponse.success("查询成功", configs);
    }

    /**
     * 创建MQ配置
     *
     * @param configInfo 配置信息
     * @return 创建结果
     */
    @PostMapping("/add")
    public ApiResponse<MQConfigInfo> addConfig(@Valid @RequestBody MQConfigInfo configInfo) {
        MQConfigInfo created = mqConfigService.createConfig(configInfo);
        return ApiResponse.success("配置创建成功", created);
    }

    /**
     * 更新MQ配置
     *
     * @param configInfo 配置信息
     * @return 更新结果
     */
    @PostMapping("/update")
    public ApiResponse<MQConfigInfo> updateConfig(@Valid @RequestBody MQConfigInfo configInfo) {
        MQConfigInfo updated = mqConfigService.updateConfig(configInfo);
        return ApiResponse.success("配置更新成功", updated);
    }

    /**
     * 删除MQ配置
     *
     * @param id 配置ID
     * @return 删除结果
     */
    @PostMapping("/delete")
    public ApiResponse<String> deleteConfig(@RequestParam String id) {
        mqConfigService.deleteConfig(id);
        return ApiResponse.success("配置删除成功");
    }

    /**
     * 启用MQ配置
     *
     * @param id 配置ID
     * @return 启用结果
     */
    @PostMapping("/enable")
    public ApiResponse<String> enableConfig(@RequestParam String id) {
        mqConfigService.enableConfig(id);
        return ApiResponse.success("配置启用成功");
    }

    /**
     * 禁用MQ配置
     *
     * @param id 配置ID
     * @return 禁用结果
     */
    @PostMapping("/disable")
    public ApiResponse<String> disableConfig(@RequestParam String id) {
        mqConfigService.disableConfig(id);
        return ApiResponse.success("配置禁用成功");
    }

    /**
     * 获取所有消息类型
     *
     * @return 消息类型列表
     */
    @GetMapping("/types")
    public ApiResponse<List<String>> getMessageTypes() {
        List<String> messageTypes = new ArrayList<>();
        mqConfigService.getAllConfigs().forEach(config -> messageTypes.add(config.getMessageType()));
        return ApiResponse.success("获取成功", messageTypes);
    }

    /**
     * 获取队列统计信息
     *
     * @return 队列统计信息
     */
    @GetMapping("/queue-stats")
    public ApiResponse<List<Map<String, Object>>> getQueueStats() {
        List<Map<String, Object>> queueStats = mqConfigService.getQueueStats();
        return ApiResponse.success("获取成功", queueStats);
    }
}